package com.heatup.apt.api.controller;

import com.alibaba.fastjson.JSONObject;
import com.heatup.apt.api.service.AccessService;
import com.heatup.apt.api.service.CoachService;
import com.heatup.apt.api.service.StoreService;
import com.heatup.apt.api.service.UserService;
import com.heatup.apt.common.dao.SmsLogMapper;
import com.heatup.apt.common.exception.OrderNotFoundException;
import com.heatup.apt.common.util.JsonTools;
import com.heatup.apt.common.util.ResponseTools;
import com.heatup.apt.model.AccessDevice;
import com.heatup.apt.model.QRDoor;
import com.heatup.apt.model.api.ApiResultModel;
import com.heatup.apt.model.coach.CoachInfo;
import com.heatup.apt.model.management.SysUser;
import com.heatup.apt.model.store.StoreInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 二维码门禁控制器
 * <p>
 * Created by blank on 2017/10/24 上午10:53
 */
@RestController
@RequestMapping("/door")
public class QRAccessController extends BaseController {

    public static final Logger log = LoggerFactory.getLogger(QRAccessController.class);

    @Resource
    private AccessService accessService;

    @Resource
    private CoachService coachService;

    @Resource
    private UserService userService;

    @Resource
    private StoreService storeService;

    @Resource
    private SmsLogMapper smsLogMapper;


    /**
     * 二维码开门
     *
     * @param qrDoor 门禁设备数据
     *               <p>
     *               Type     上传数据类型 0: IC卡卡号 1: 二维码数据 2: 身份证 3: 密码
     *               SCode    上面对应数据类型对应的数据
     *               DeviceID 设备编码：指设备的MAC地址码，长度12
     *               ReaderNo 读头号:指一个设备上的多个输入外设，如IC读头1、2，二维码读头1，2等一般1表示进，2表示出
     *               ActIndex 动作位置：动作的继电器位置，一般指要求执行哪个继电器，一般是1，2，如果二个继电器同时进行则值为3
     *               SN       项目编号: 如不用默认填:001
     *               UserName 自定义参数 当前用户名
     *               PassWord 自定义参数 当前密码
     * @return {
     * “resultCode”:”1”, //1为成功，0为不成功，不成功后面参数随便填
     * “ActIndex”:“1”，  //允许打开继电器1,3则打开继电器1和继电器2
     * “Audio”:“00”，    //0不使用语音，其它值04（请进）或语音复合代码，请查看语音表
     * “time1”:“0005”    //继电器1动作时间：0000为默认时间,二字节高字节在前低字节在后
     * “time2”:“00A5”    //继电器2动作时间：0000为默认时间
     * "msg": "验证成功"  //验证成功和失败等等信息提示
     * }
     * @author blank 2017/10/24 上午11:04
     */
    @RequestMapping(value = "open_door")
    public String openDoor(QRDoor qrDoor, HttpServletRequest httpRequest) {


//        log.info("门禁开门请求 ---> type " + Type + " 密码 " + SCode + " 设备ID" + DeviceID + " ReaderNo " + ReaderNo +  " ActIndex " + ActIndex + " SN " + SN + " UserName: " + UserName + " Password: " + PassWord);
        log.info("门禁开门请求 ---> " + qrDoor);

        int passStart = qrDoor.getSCode().indexOf("|") + 1;
        int passEnd = passStart + 8;
        String password = qrDoor.getSCode().substring(passStart, passEnd);

        boolean isRight = accessService.checkQRCodePwd(password, qrDoor);

        SimpleDateFormat df = new SimpleDateFormat("yyMMddHHmmss");//设置日期格式
        qrDoor.setSCode(password + df.format(new Date()));

        //记录密码使用
        accessService.updateDoorDeviceOfflineData(qrDoor);


//        //记录密码使用
//        accessService.updateAccessDevicePWDUsedCount(qrDoor.getDeviceID(), pass, isRight, false);

        JSONObject resultJson = new JSONObject();

        resultJson.put("Type", qrDoor.getType());
        resultJson.put("SCode", qrDoor.getSCode());
        resultJson.put("DeviceID", qrDoor.getDeviceID());
        resultJson.put("ReaderNo", qrDoor.getReaderNo());
        resultJson.put("ActIndex", qrDoor.getActIndex());
        resultJson.put("SN", qrDoor.getSN());
        resultJson.put("ResultCode", isRight ? "1" : "0");//开门参数
        resultJson.put("Audio", isRight ? "04" : "6E");// 04 请进 /51超过使用次数 52已过期 6E无效 41 无效证件
        resultJson.put("Time1", "0000");
        resultJson.put("Time2", "0000");
        resultJson.put("Msg", isRight ? "验证成功" : "验证失败");

        log.info("门禁开门请求 <=== " + resultJson);

        return resultJson.toJSONString();


    }

    /**
     * 二维码设备心跳
     *
     * @param qrDoor 门禁设备数据
     *               <p>
     *               DeviceTime 设备时间：171018142347 （2017-10-18 14:23:47）
     *               Version    设备版本号
     *               DoorStatus 00第1个0表示门1门磁是状态，第2个0表示门2门磁状态 0表示闭合的，1表示断开的，如果只有一个门，则门2值不用管
     *               DeviceID   设备编码：指设备的MAC地址码，长度12
     *               SN         项目编号: 如不用默认填:001
     *               UserName   自定义参数 当前用户名
     *               PassWord   自定义参数 当前密码
     * @return {
     * “resultCode”:”1”, 1成功接收，0 失败
     * “CorrectTime”:“171024155500” 如果 CorrectTime 有值 表示要校对设备时间，此例子的校对时间为2017-10-24 15:55:00
     * }
     * @author blank 2017/10/24 下午3:40
     */
    @RequestMapping(value = "door_heart_beat")
    public String doorHeartbeat(QRDoor qrDoor) {

//          log.info("门禁心跳请求 ---> 设备ID: " + DeviceID +  " 设备时间 " + DeviceTime +" DoorStatus: " + DoorStatus + " UserName: " + UserName + " Password: " + PassWord);
        log.info("门禁心跳请求 --->  " + qrDoor);
//
        AccessDevice accessDevice = new AccessDevice();
        accessDevice.setDeviceSerialId(qrDoor.getDeviceID());
        boolean s = false;
        try {
            s = accessService.updateDoorDeviceHeartBeat(accessDevice);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("门禁心跳更新出错: " + e.toString() + e.getCause());
        }


        JSONObject resultJson = new JSONObject();


        SimpleDateFormat df = new SimpleDateFormat("yyMMddHHmmss");
        String dateStr = df.format(new Date());
        resultJson.put("ResultCode", "1");
        resultJson.put("CorrectTime", dateStr);
        resultJson.put("Msg", s ? "处理成功" : "处理失败");

        log.info("门禁心跳请求 <=== " + resultJson.toString());

        return resultJson.toJSONString();


    }

    /**
     * 二维码离线使用数据上传
     *
     * @param qrDoor 门禁设备数据
     *               <p>
     *               SCode    离线扫码使用数据: 以,分隔
     *               DeviceID 设备编码：指设备的MAC地址码，长度12
     *               SN       项目编号: 如不用默认填:001
     *               UserName 自定义参数 当前用户名
     *               PassWord 自定义参数 当前密码
     * @return {
     * “resultCode”:”1”,//1为确认成功，0为不成功，要求重传此记录
     * "msg": "上传成功" //上传成功和失败等等信息提示
     * }
     * @author blank 2017/10/24 下午4:10
     */
    @RequestMapping(value = "door_offline_data")
    public String doorOffLineData(

            QRDoor qrDoor) {

//        log.info("门禁离线数据同步请求 ---> 设备ID: " + DeviceID + " SCode: " + SCode + " SN: " + SN + " UserName: " + UserName + " Password: " + PassWord);
        log.info("门禁离线数据同步请求 ---> 设备: " + qrDoor);


        JSONObject resultJson = new JSONObject();

        boolean s = accessService.updateDoorDeviceOfflineData(qrDoor);

        resultJson.put("ResultCode", s ? "1" : "0");
        resultJson.put("Msg", s ? "处理成功" : "处理失败");
        log.info("门禁离线数据同步请求  <=== " + resultJson);

        return resultJson.toJSONString();


    }

    /**
     * 订单详情中的二维码接口
     *
     * @param orderId 订单 ID
     * @return 2分钟有效的二维码
     * @author blank 2017/10/30 下午3:07
     */
    @RequestMapping("order_qrcode")
    public String orderQRCode(@RequestParam Integer orderId) {


        JSONObject resultJson = new JSONObject();

        try {
            resultJson.put("QRCode", accessService.updateAndGetNewQRCodeByOrderId(orderId));
        } catch (OrderNotFoundException e) {
            e.printStackTrace();

        }


        return resultJson.toJSONString();

    }

    /**
     * 教练/系统用户 获取密码界面 门店列表接口
     *
     * @return 门店列表
     */
    @RequestMapping(value = "/store_list", method = {RequestMethod.POST, RequestMethod.GET})
    public String getDoorInfoList(String callback) {

        //TODO 修改只返回教练上课门店列表
        List<StoreInfo> storeList = storeService.queryAllStoreListWithAccessDevice();
        ApiResultModel<Object> apiResultModel = new ApiResultModel<>();
        apiResultModel.setData(storeList);
        apiResultModel.setLogined(this.isLogined());
        return ResponseTools.CallBackResultJsonP(JsonTools.jsonSer(apiResultModel), callback);
    }


    /**
     * 教练/系统用户 获取密码请求
     *
     * @param storeId  门店 ID 必传
     * @param callback js 回调
     * @return QRCode String
     */
    @RequestMapping(value = "/coach_req_pwd", method = {RequestMethod.POST, RequestMethod.GET})
    public String reqCoachPwd(@RequestParam Integer storeId, String callback) {

        ApiResultModel<Object> apiResultModel = new ApiResultModel<>(isLogined());
        try {

            CoachInfo coachUser = coachService.queryCoachByMobile(getUserInfo().getMobile());
            if (coachUser != null) {
                //教练密码创建
                apiResultModel.setData(accessService.returnNewQRCodeByUserType(storeId, 1, getUserId(), null, null));
            } else {
                SysUser sysUser = accessService.querySysUserByMobile(getUserInfo().getMobile());
                if (sysUser != null) {
                    //系统用户密码创建
                    Calendar calendar = Calendar.getInstance();
                    calendar.set(2100, Calendar.DECEMBER, 31);
                    apiResultModel.setData(accessService.returnNewQRCodeByUserType(storeId, 2, getUserId(), null, calendar.getTime()));

                }
            }


        } catch (Exception e) {
            e.printStackTrace();
            log.error("创建教练/系统用户 QRCode 出错 --> " + e.toString() + e.getCause(), e);
        }
        log.info("获取密码请求返回 --->" + apiResultModel.toString());

        return ResponseTools.CallBackResultJsonP(JsonTools.jsonSer(apiResultModel), callback);
    }

    /**
     * 用户 快速获取二维码接口
     * 查询用户当前的有效 私教/团课/自助 订单 如果存在直接返回有效的二维码,否则提示用户需要先下单后再操作
     *
     * @return 开门二维码 或提示消息
     * @author blank
     * @since 2018/7/17 下午2:48
     */
    @RequestMapping(value = "/get_user_qr_code", method = {RequestMethod.POST, RequestMethod.GET})
    public String enterQRCode(String callback) {


        ApiResultModel apiResultModel = userService.enterQRCode(getUserInfo());
        if (apiResultModel != null) {
            apiResultModel.setLogined(isLogined());
        } else {
            apiResultModel = new ApiResultModel();
            apiResultModel.setMsg("查询不至用户数据");
        }
        return ResponseTools.CallBackResultJsonP(JsonTools.jsonSer(apiResultModel), callback);

    }


    /**
     * 创建长期有效密码
     */
    public void createdLongTremPass() {


        String randomPassword = accessService.fanhuiNewRandomPassword();

        accessService.createCoachOrSysUserPwd("18607554663", 1, 2);


    }

    public static void main(String[] args) {
        //生成一个随机8位密码


    }
}
